package br.com.sgbl.dao;

import br.com.sgbl.bean.Funcionario;
import br.com.sgbl.bean.Mesa;
import br.com.sgbl.bean.Pedido;
import br.com.sgbl.utils.Conexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author Leandro
 */
public class PedidoDao {
    
    private static final String SQL_LISTAR =
            "SELECT * FROM PEDIDO";
    private static final String SQL_INSERIR =
            "INSERT INTO PEDIDO (ID, EMISSAO, FK_MESA_ID, FK_FUNCIONARIO_ID, VALOR_TOTAL) "
            + "VALUES (?, ?, ?, ?, ?)";
    private static final String SQL_ALTERAR =
            "UPDATE PEDIDO SET NUMERO_DA_MESA = ?, TOTAL = ?"
            + "WHERE ID = ?";
    private static final String SQL_EXCLUIR =
            "DELETE FROM PEDIDO WHERE ID = ?";
    
    private ItemPedidoDao itemPedidoDao;
    private Mesa mesa;

    public PedidoDao() {
        itemPedidoDao = new ItemPedidoDao();
        mesa = new Mesa();
    }
    
    public Pedido salvar(Pedido pedido) throws SQLException {
        if (pedido.getId() == 0) {
            return inserir(pedido);
        } else {
            return alterar(pedido);
        }
    }
    
    public Pedido inserir(Pedido pedido) throws SQLException {
        Connection conn = Conexao.getConnection();
        
        pedido.setEmissao(new Date());
        
        try {
            PreparedStatement ps = conn.prepareStatement(SQL_INSERIR, PreparedStatement.RETURN_GENERATED_KEYS);
            ps.setNull(1, Types.NULL);
            ps.setDate(2, new java.sql.Date(pedido.getEmissao().getTime()));
            ps.setLong(3, pedido.getMesa().getId()); //CHAVE ESTRANGEIRA
            ps.setLong(4, pedido.getFuncionario().getId()); //CHAVE ESTRANGEIRA
            ps.setDouble(5, pedido.getValorTotal());

            ps.executeUpdate();

            ResultSet rs = ps.getGeneratedKeys();
            rs.first();

            pedido.setId(rs.getLong("GENERATED_KEY"));

            itemPedidoDao.inserirLista(conn, pedido.getId(), pedido.getItemPedidos());

            conn.commit();
        } finally {
            conn.close();
        }
        return pedido;
    }
    
    private Pedido alterar(Pedido pedido) throws SQLException {
        Connection conn = Conexao.getConnection();
        
        pedido.setEmissao(new Date());
        
        try {
            PreparedStatement ps = conn.prepareStatement(SQL_ALTERAR);
            ps.setDate(1, new java.sql.Date(pedido.getEmissao().getTime()));
            ps.setLong(2, pedido.getMesa().getId());
            ps.setDouble(3, pedido.getValorTotal());
            ps.setLong(4, pedido.getId());

            ps.executeUpdate();

            itemPedidoDao.excluir(conn, pedido.getId());
            itemPedidoDao.inserirLista(conn, pedido.getId(), pedido.getItemPedidos());

            conn.commit();
    } finally {
        conn.close();
    }
    return pedido;
}
    
    public Pedido localizar(Connection conn, long codigo) throws SQLException {
        PreparedStatement ps = conn.prepareStatement(SQL_LISTAR + " where id = ?");
        ps.setLong(1, codigo);

        ResultSet rs = ps.executeQuery();

        if (rs.first()) {
            Pedido pedido = new Pedido();
            pedido.setId(rs.getLong("id"));
            pedido.setValorTotal(rs.getDouble("valor_total"));
            pedido.setEmissao(rs.getDate("emissao"));
            
            FuncionarioDao funcionarioDao = new FuncionarioDao();
            Funcionario funcionario = funcionarioDao.localizar(conn, rs.getLong("fk_funcionario_id"));
            pedido.setFuncionario(funcionario);
            
            MesaDao mesaDao = new MesaDao();
            Mesa mesa = mesaDao.localizar(conn, rs.getLong("fk_mesa_id"));
            pedido.setMesa(mesa);
            
            return pedido;
        } else {
            return null;
        }
    }
    
    public List listar() throws SQLException {
        List lista = new ArrayList();

        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_LISTAR);

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                Pedido pedido = new Pedido();

                pedido.setId(rs.getLong("id"));
                
                MesaDao mesaDao = new MesaDao();
                Mesa mesa = mesaDao.localizar(conn, rs.getLong("fk_mesa_id"));
                pedido.setMesa(mesa);
                
                pedido.setValorTotal(rs.getDouble("valor_total"));
                pedido.setEmissao(rs.getDate("emissao"));
                
                FuncionarioDao funcionarioDao = new FuncionarioDao();
                Funcionario funcionario = funcionarioDao.localizar(conn, rs.getLong("fk_funcionario_id"));
                pedido.setFuncionario(funcionario);
                
                lista.add(pedido);
            }
        } finally {
            conn.close();
        }

        return lista;
    }
    
    public Pedido excluir(Pedido pedido) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            itemPedidoDao.excluir(conn, pedido.getId());

            PreparedStatement ps = conn.prepareStatement(SQL_EXCLUIR);
            ps.setLong(1, pedido.getId());

            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }
        
        return pedido;
    }
    
}
